package com.server.questionbank.snframe.util.Note;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 文件操作工具类
 * 提供文件上传、删除等基础功能
 */
@Component
public class FileUtils {

    /** 文件上传根路径，从配置文件中读取 */
    @Value("${file.upload.path}")
    private static String uploadPath;

    /**
     * 上传文件到服务器
     * 文件按年月日目录分类存储，文件名使用UUID生成
     * @param file 上传的文件对象
     * @return 文件的相对存储路径
     * @throws RuntimeException 当文件为空或上传失败时抛出
     */
    public static String upload(MultipartFile file) {
        // 文件为空检查
        if (file.isEmpty()) {
            throw new RuntimeException("文件为空");
        }

        // 生成日期路径，格式：/yyyy/MM/dd/
        String datePath = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
        
        // 处理文件名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            throw new RuntimeException("原始文件名为空");
        }
        // 获取文件扩展名
        String fileExtension = originalFilename.lastIndexOf(".") > -1 ? 
            originalFilename.substring(originalFilename.lastIndexOf(".")) : "";
        // 使用UUID生成唯一文件名
        String fileName = UUID.randomUUID().toString() + fileExtension;
        
        // 构建完整的文件存储路径
        String fullPath = uploadPath + datePath;
        String filePath = fullPath + fileName;
        
        // 确保目录存在
        File dest = new File(fullPath);
        if (!dest.exists()) {
            dest.mkdirs();
        }
        
        try {
            // 保存文件到服务器
            file.transferTo(new File(filePath));
            // 返回相对路径
            return datePath + fileName;
        } catch (IOException e) {
            throw new RuntimeException("文件上传失败", e);
        }
    }

    /**
     * 从服务器删除文件
     * @param filePath 文件的相对路径
     * @return 删除是否成功
     */
    public static boolean delete(String filePath) {
        if (filePath == null || filePath.isEmpty()) {
            return false;
        }
        
        File file = new File(uploadPath + filePath);
        return file.exists() && file.isFile() && file.delete();
    }

    /**
     * 获取文件大小
     * @param filePath 文件路径
     * @return 文件大小（字节）
     */
    public static long getFileSize(String filePath) {
        File file = new File(uploadPath + filePath);
        if (file.exists() && file.isFile()) {
            return file.length();
        }
        return 0L;
    }
}